package air.jason.com.porterduffxfermodetest.view;

/**
 * @DESC:
 * @Author: Jason
 * @Date: 16/8/24
 * @Time: 23:28
 */

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.util.AttributeSet;
import android.view.View;

import air.jason.com.porterduffxfermodetest.R;

/**
 * PorterDuff.Mode.DST_IN
 * 计算方式：[Sa * Da, Sa * Dc]  ：只在源图像和目标图像相交的地方绘制目标图像
 * 最常见的应用就是蒙板绘制
 */

public class DisInView2 extends View {

    private Paint mPaint; // 画笔
    private Bitmap mBitmapDis , mBitmapSrc; // 位图
    private PorterDuffXfermode mPorterDuffXfermode; // 图形混合模式

    private int x, y; // 位图绘制时左上角的起点坐标
    private int screenW, screenH; // 屏幕尺寸

    public DisInView2(Context context) {
        this(context, null);
    }

    public DisInView2(Context context, AttributeSet attrs) {
        super(context, attrs);


        // 实例化混合模式
        mPorterDuffXfermode = new PorterDuffXfermode(PorterDuff.Mode.DST_IN);
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        // 获取位图
        mBitmapDis = BitmapFactory.decodeResource(context.getResources(), R.drawable.a3);
        mBitmapSrc = BitmapFactory.decodeResource(context.getResources(), R.drawable.a3_mask);
        // 获取屏幕宽高
        screenW = context.getResources().getDisplayMetrics().widthPixels;
        screenH = context.getResources().getDisplayMetrics().heightPixels;

        // 计算位图绘制时左上角的坐标使其位于屏幕中心
        // 屏幕坐标x轴向左偏移位图一半的宽度
        // 屏幕坐标y轴向上偏移位图一半的高度
        x = screenW / 2 - mBitmapDis.getWidth() / 2;
        y = screenH / 2 - mBitmapDis.getHeight() / 2;

    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        canvas.drawColor(Color.WHITE);

        // 将绘制操作保存到新的图层(官方的说法应该是离屏缓存)
        int sc = canvas.saveLayer(0, 0, screenW, screenH, null, Canvas.ALL_SAVE_FLAG);

        // 先绘制dis目标图
        canvas.drawBitmap(mBitmapDis, x, y, mPaint);
        // 设置混合模式
        mPaint.setXfermode(mPorterDuffXfermode);

        // 再绘制src源图
        canvas.drawBitmap(mBitmapSrc, x, y, mPaint);
        // 还原混合模式
        mPaint.setXfermode(null);
        // 还原画布
        canvas.restoreToCount(sc);
    }
}
